Load data first
sounds filenames
"ow_runaway_melody.wav"
"ow_runaway_based_bass.wav"
"ow_runaway_full.wav"
do some magic with filenames
"C:/data/projects/fft/fft-for-fun/data/ow_runaway_melody.wav"
"C:/data/projects/fft/fft-for-fun/data/ow_runaway_based_bass.wav"
"C:/data/projects/fft/fft-for-fun/data/ow_runaway_full.wav"
xxxxxxxxxxfiles = map( name -> replace("$(normpath(joinpath(@__FILE__, "..", "..")))data/"*name, "\\" => "/"), filenames)parse and get acoustic samples
7578667×2 Array{Float64,2}:
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
⋮
-3.05185e-5 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.07578667×2 Array{Float64,2}:
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
⋮
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.07578667×2 Array{Float64,2}:
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
⋮
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0
0.0 0.0xxxxxxxxxxparsed = [wavread(name)[1] for name in files]due to documentation, the first returned value is the data
15157334xxxxxxxxxxlength(parsed[1])thats too l0ng sound, cut smth off
15157334 == 180 s.
336000 == 4 s.
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
-0.0158086
-0.0294809
-0.0422376
-0.0536515
-0.0633564
-0.0710776
-0.0765404
-0.0796228
-0.0801721
-0.0782495
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.177801
0.182562
0.187231
0.19187
0.196448
0.200964
0.20539
0.209754
0.214057
0.218268
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.169225
0.167547
0.166234
0.165471
0.165441
0.166265
0.168035
0.170843
0.174718
0.179662
x
begin sz = 336000 shrink = [ p[1:sz] for p in parsed ]endx
sounds = ( melody=shrink[1], bass =shrink[2], full =shrink[3]);lets plot melody and bass waves
x
plot([sounds.melody, sounds.bass], layout=2)and full, mixed up
x
plot(sounds.full)now we can FFT
историческая справка: преобразование Фурье переводит содержимое *.wav файла в формат частот
-477.091+0.0im
8.17909+10.3384im
13.741-13.7773im
39.7332+5.69267im
38.8432+22.2648im
436.063+55.9534im
-66.8175-24.6853im
-58.0506+12.0036im
-77.6107-29.895im
-61.2397-43.885im
-346.667-104.775im
118.111+63.4176im
83.4279+7.41983im
83.3839+55.7542im
54.4538+59.9019im
236.742+128.816im
-140.092-119.287im
-85.1284-33.3887im
-63.0419-74.1623im
-30.0613-61.1259im
-346.667+104.775im
-61.2397+43.885im
-77.6107+29.895im
-58.0506-12.0036im
-66.8175+24.6853im
436.063-55.9534im
38.8432-22.2648im
39.7332-5.69267im
13.741+13.7773im
8.17909-10.3384im
110.218+0.0im
-73.4476+108.633im
50.9481+79.7494im
19.2993+44.5433im
-13.4279-47.5565im
42.2768-13.1802im
-51.8655+50.1493im
6.01922+96.6328im
7.93124+8.07052im
8.57625+5.82507im
-18.0226-76.9191im
61.1715-42.6003im
-3.09096-36.7624im
60.8627-31.3328im
-31.2472+42.665im
-13.5752+6.42453im
50.1979-63.631im
-11.8738-67.8499im
47.3329+12.3294im
-39.0646+67.1767im
-18.0226+76.9191im
8.57625-5.82507im
7.93124-8.07052im
6.01922-96.6328im
-51.8655-50.1493im
42.2768+13.1802im
-13.4279+47.5565im
19.2993-44.5433im
50.9481-79.7494im
-73.4476-108.633im
-93.569+0.0im
-78.5982+78.5635im
8.29198+61.0895im
4.13366+76.7825im
13.6396-13.4331im
249.701-7.06294im
-114.502+11.9929im
-67.6677+114.535im
-38.1666+29.696im
-3.55112-11.9985im
-188.544-151.948im
67.562-18.2989im
5.02278+0.71612im
107.843+19.7465im
3.45626+52.5325im
63.2231+44.0684im
-59.4847-98.5065im
-57.494-44.0637im
35.3528-17.5881im
-62.4256+11.9019im
-188.544+151.948im
-3.55112+11.9985im
-38.1666-29.696im
-67.6677-114.535im
-114.502-11.9929im
249.701+7.06294im
13.6396+13.4331im
4.13366-76.7825im
8.29198-61.0895im
-78.5982-78.5635im
x
frequencies = fft.(shrink)draw melody and bass freqs separately..
примечание
рисуем в первых 10000 единиц времени, т.к судя по рисункам выше, 10к – это период функций, и дальше все поввторяется
рисуем модули чисел, т.к не хотим возиться с комплексными числами
x
plot([abs.(frequencies[1]), abs.(frequencies[2])], layout=2, x_lims=(1, 10000))then draw the sum of melody and bass freqs..
x
plot(abs.(frequencies[1] + frequencies[2]), x_lims=(1, 10000))and finally check on the result of FFT..
x
plot(abs.(frequencies[3]), x_lims=(1, 10000))Таким образом, алгос:
Делаем преобразование Фурье песни
куча деталей и подводных камней
получаем набор частот
конец